<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  
  <meta name="generator" content="Hugo 0.98.0" />

  
  <meta name="description" content="走在通往幸福的路上">
  

  
  <link rel="apple-touch-icon" sizes="180x180" href="https://blog.v5u.win/apple-touch-icon.png">

  
  <link rel="icon" type="image/png" sizes="32x32" href="https://blog.v5u.win/favicon-32x32.png">

  
  <link rel="icon" type="image/png" sizes="16x16" href="https://blog.v5u.win/favicon-16x16.png">

  
  <link rel="manifest" href="https://blog.v5u.win/site.webmanifest">

  
  <link rel="mask-icon" href="https://blog.v5u.win/safari-pinned-tab.svg" color="">

  <meta name="msapplication-TileColor" content="">

  <meta name="theme-color" content="">

  
  <link rel="stylesheet" href="https://blog.v5u.win/css/bootstrap.min.css" />

  
  <title>自定义back按钮无法使用系统pop interactive gesture 问题 | 为吾优</title>
  

  <style>
body {
  min-width: 300px;
}

.custom-navbar {
  margin-bottom: 1em;
  height: 60px;
}

.custom-navbar a {
  display: inline-block; 
  padding: 18px 0;
  margin-right: 1em; 
  font-weight: bold; 
}

.custom-navbar a:hover,
.custom-navbar a:focus {
  text-decoration: none; 
}

@media print {
  .custom-navbar {
    display: none;
  }
}

article {
  padding-bottom: 1em;
}

img {
  max-width: 100%;
}


body {
  background-color: #fff;
}



body {
  color: #212529;
}



a {
  color: #007bff;
}



a:hover,
a:focus {
  color: #0056b3;
}



.custom-navbar {
  background-color: #212529;
}



.custom-navbar a {
  color: rgba(255,255,255,.75);
}



.custom-navbar a:hover,
.custom-navbar a:focus {
  color: rgba(255,255,255,1);
}



.container {
  max-width: 800px;
}





</style>
</head>

<body>
  <nav class="custom-navbar">
  <div class="container">
    
    <a href="/">文章</a>
    
    <a href="/tags/">标签</a>
    
    <a href="/about/">关于</a>
    
    <a href="/index.xml">RSS</a>
    
  </div>
</nav>
  
  <div class="container">
    <article>
      <h1>自定义back按钮无法使用系统pop interactive gesture 问题</h1>
<p>两种解决办法：</p>
<p>方法一：</p>
<p>A，我的应用是自定义的返回按钮图标(默认返回按钮样式不会出现问题3)，为了保险，写了这句代码[self.navigationItem setHidesBackButton:YES]。 由于自定义返回按钮，所以iOS7自带返回手势无效。在需要的页面加上navigationController.interactivePopGestureRecognizer.delegate = self 返回手势好用了。</p>
<p>B，于是出现了第二个问题。 在一级视图中，iOS样式返回的手势滑动一下，然后进入二级视图，发现，画面卡住了，按Home键转入后台，再返回应用，发现并没有Crash掉，而是直 接跳到了二级视图里，运行正常了，大家知道push和pop的原理是用进栈出栈完成的，可能因为在一级视图中滑动那一下，影响了视图在栈中的位置。 好，先解决一下这个问题，一级视图中一定要加入self.navigationController.interactivePopGestureRecognizer.enabled = NO;，先把iOS7手势返回屏蔽掉，到二级视图再用self.navigationController.interactivePopGestureRecognizer.enabled = YES打开。就Ok了。</p>
<p>C，好，第三个问题相继出现（其实是跟第二个一起出来的）。 手势返回拖动一半，放手，navigationBar上会出现三个小蓝点，而且位置不规律，可以肯定这个不是项目代码或者图片搞出来的东西，一定是SDK自己蹦出來的。 后台尝试发现UIBarButtonItem的title如果是nil的话，就会有这个问题。 解决方案：把[self.navigationItem setHidesBackButton:YES];去掉，然後把假装成返回按钮的UIBarButtonItem的title设置成@&quot;&quot;。</p>
<p>方法二：</p>
<!-- raw HTML omitted -->
<p> - (      self.interactivePopGestureRecognizer. =     self. =<!-- raw HTML omitted --><!-- raw HTML omitted -->
<!-- raw HTML omitted -->    [super dealloc];
   
<!-- raw HTML omitted --> <!-- raw HTML omitted -->}</p>
<p><!-- raw HTML omitted --> <!-- raw HTML omitted --><!-- raw HTML omitted -->
  mark - View lifecycle<!-- raw HTML omitted --><!-- raw HTML omitted --> <!-- raw HTML omitted --><!-- raw HTML omitted -->
 - (                     self.interactivePopGestureRecognizer. =         self. =    - (<!-- raw HTML omitted --><!-- raw HTML omitted -->  mark - Override<!-- raw HTML omitted --><!-- raw HTML omitted --> - ()pushViewController:(UIViewController <em>                    self.interactivePopGestureRecognizer.enabled =         mark - UINavigationControllerDelegate<!-- raw HTML omitted --><!-- raw HTML omitted -->  - ()navigationController:(UINavigationController </em>       didShowViewController:(UIViewController *                navigationController.interactivePopGestureRecognizer.enabled =<!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted --><!-- raw HTML omitted -->
<!-- raw HTML omitted --><!-- raw HTML omitted --> <!-- raw HTML omitted -->@end<!-- raw HTML omitted --><!-- raw HTML omitted --></p>
<p> </p>
<p>3、Pop interactive gesture冲突，造成页面假死问题</p>
<p>我遇到的情况是，Push/Pop页面时，没有立即得到想要的效果，页面没有显出出来，NavigationController的didShowViewController:回调方法也没有调用。</p>
<p>页面布局情况是这样的：视图A，有一个Pan手势；视图B是TabBarController，其ViewControllers都是NavigationController。视图B是视图A的子视图。</p>
<p>后来找到原因是：navigationController的interactive pop手势与视图A的pan手势冲突。</p>
<p>具体原因是：rootViewController加载时，调用了didShowViewController:，设置interactivePopGestureRecognizer可用，其实我们并不需要在root的时候也触发这个手势。所以稍加优化如下：</p>
<!-- raw HTML omitted -->

    </article>
  </div>

  
  
  

  
</body>

</html>